package br.com.tcc.dao;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.NoResultException;
import javax.persistence.Persistence;
import javax.persistence.Query;

import org.apache.log4j.Logger;

import br.com.tcc.model.Usuario;

public class UsuarioDAO {
	
	private EntityManagerFactory emf;
	Logger logger = Logger.getLogger(UsuarioDAO.class);
	
	public UsuarioDAO() {
		emf = Persistence.createEntityManagerFactory("persistencia");
	}

	/**
	 * Adicionar um usuario no banco de dados
	 * @param usuario
	 * @return
	 */
	public boolean adicionar(Usuario usuario) {
		EntityManager em = emf.createEntityManager();
		boolean retorno = true;
		try{
			em.getTransaction().begin();
			em.persist(usuario);
			em.getTransaction().commit();
		}catch(Exception e){
			em.getTransaction().rollback();
			logger.warn("Erro no metodo  [ " + e.getMessage() + " ]");
			retorno = false;
		}finally{
			em.close();
		}
	   	return retorno;
	}

	/**
	 * Consultar se um CPF ja existe na tabela
	 * @param cpf
	 * @return
	 */
	public boolean verificarCpf(String cpf) {
		boolean retorno = false;
		EntityManager em = emf.createEntityManager();
		
		em.getTransaction().begin();
		Query q = em.createQuery("select u from Usuario u where u.cpf =:cpf");
		q.setParameter("cpf", cpf);
		if (q.getResultList().size() > 0)	 {
			return true;
		}
		return retorno;
	}
	
	/**
	 * Consultar um usuario pelo ID na tabela
	 * @param id
	 * @return
	 */
	public Usuario buscarId(int id){
		Usuario retorno = null;
		EntityManager em = emf.createEntityManager();
		try{
		   	em.getTransaction().begin();
		   	retorno = em.find(Usuario.class, id);
		}catch (NoResultException e) {
			logger.info("sem registro");
		}catch (Exception e) {
			logger.warn("Erro no metodo  [ " + e.getMessage() + " ]");
		}finally{
			em.close();
		}
		return retorno;
	}
	
	/**
	 * Buscar se o email informado pelo usuario ja possui cadastro
	 * @param email
	 * @return
	 */
	public boolean verificarEmail(String email){
		boolean retorno = false;
		EntityManager em = emf.createEntityManager();
		try{
		   	em.getTransaction().begin();
		   	Query q = em.createQuery("select u from Usuario u where u.email=:email");
		   	q.setParameter("email", email);
	
		   	if(q.getResultList().size()>0){
		   		retorno = true;
		   	}
	   	
		}catch (NoResultException e) {
			logger.info("sem registro");
		}catch (Exception e) {
			logger.warn("Erro no metodo  [ " + e.getMessage() + " ]");
		}finally{
			em.close();
		}
		return retorno;
	}
	
	/**
	 * Alterar os dados de um usuario
	 * @param Usuario
	 * @return boolean
	 */
	public boolean alterar(Usuario u){
		boolean retorno = true;
		EntityManager em = emf.createEntityManager();
		try{
		   	em.getTransaction().begin();
		   	em.merge(u);
		   	em.getTransaction().commit();
		}catch(Exception e){
			em.getTransaction().rollback();
			logger.warn("Erro no metodo  [ " + e.getMessage() + " ]");
			retorno = false;
		}finally{
			em.close();
		}
		return retorno;
	}
	
	/**
	 * Validar o login de um usuario atravez da senha e email
	 * @param email
	 * @param senha
	 * @return
	 */
	public Usuario validarLogin(String email, String senha) {
		Usuario retorno = null;
		EntityManager em = emf.createEntityManager();
		try{
		   	em.getTransaction().begin();
		   	Query q = em.createQuery("select u from Usuario u where u.email=:email and u.senha=:senha");
		   	q.setParameter("email", email);
		   	q.setParameter("senha",senha);
	
		   	retorno = (Usuario) q.getSingleResult();
	   	
		}catch (NoResultException e) {
			logger.info("sem registro");
		}catch (Exception e) {
			logger.warn("Erro no metodo  [ " + e.getMessage() + " ]");
		}finally{
			em.close();
		}
		
		return retorno;
	}
	
	/**
	 * Recuperar senha
	 * @param email
	 * @return
	 */
	public String recuperarSenha(String email) {
		String retorno = null;
		EntityManager em = emf.createEntityManager();
		try{
		   	em.getTransaction().begin();
		   	Query q = em.createQuery("select u.senha from Usuario u where u.email=:email");
		   	q.setParameter("email", email);
	
		   	retorno = (String)  q.getSingleResult();
	   	
		}catch (NoResultException e) {
			logger.info("sem registro");
		}catch (Exception e) {
			logger.warn("Erro no metodo  [ " + e.getMessage() + " ]");
		}finally{
			em.close();
		}
		
		return retorno;
	}
}
